Quan hệ với C++ C_(ngôn_ngữ_lập_trình)

C++ nguyên là sự kết thừa từ C. Mặc dù vậy, không phải mọi chương trình trong C đều hợp lệ trong C++. Vì là hai ngôn ngữ độc lập, số lượng không tương thích giữa hai ngôn ngữ này đã tăng lên. . Phiên bản cuối cùng C99 đã tạo ra thêm nhiều tính năng xung đột (giữa C và C++). Các sự khác nhau này tạo ra khó khăn để viết các chương trình và thư viện đẻ có thể được dịch và hoạt động chính xác trong cả hai loại mã C hay C++, đồng thời gây nhầm lẫn cho những người lập trình dùng cả hai ngôn ngữ này. Sự chênh lệch này cũng gây khó khăn cho ngôn ngữ này có thể tiếp thu các tính năng của ngôn ngữ kia.

Bjarne Stroustrup, cha đẻ của C++ đã lập đi lập lại rằng : Các tính chất không tương thích giữa C và C++ nên được hạ thấp càng nhiều càng tốt để mở rộng tối đa khả năng hoạt động thông suốt của hai ngôn ngữ này. Một số người tranh biện rằng vì C và C++ là hai ngôn ngữ khác nhau, sự tương thích giữ chúng thì hữu ích nhưng không phải có tính sống còn, theo lập trường này, nỗ lực để giảm sự không tương thích không được phá hủy cố gắng để nâng cao mỗi ngôn ngữ đứng riêng.

Ngày nay, những khác nhau căn bản, không kể các mở rộng thêm vào của C++ như là các lớp, các tiêu bản, các không gian tên, và quá tải, giữa hai ngôn ngữ là:

  • inline — các hàm inline có giá trị toàn cục trong C++ và chỉ có giá trị trong phạm vi tập tin trong C.
  • Từ khóa bool trong C99 thì có riêng tập tin tiêu dề của nó là <stdbool.h>. Các chuẩn C trước đây đã không định nghĩa kiểu boolean và nhiều phương pháp không tương thích đã được dùng để mô phỏng kiểu boolean.
  • Các hằng ký tự (được đặt trong dấu ') có độ lớn của một int trong C và có độ lớn của một char trong C++. Mặc dù vậy, ngay cả trong C các hàng này sẽ không bao giờ vượt quá giá trị của một char, cho nên việc chuyển đổi kiểu (char)'a' thì hoàn toàn an toàn.
  • Nhừng từ khóa mới thêm vào trong C++ sẽ không thể dược dùng làm các tên trong C như trước đây nữa. (Ví dụ: try, catch, template, new, delete,...).
  • Trong C++, trình dịch tự động tạo một "thẻ" cho mỗi struct, union hay enum, do vậy, struct S {}; trong C++ tương đương với typedef struct S {} S; trong C.

C99 tiếp thu một số tính năng mà xuất hiện đầu tiên trong C++. Trong số đó là:

  • Bắt cuộc khai báo nguyên mẫu của hàm.
  • Thêm từ khóa inline.
  • Hủy bỏ "hiểu ngầm" của sự trả về sẽ có kiểu int.

Tài liệu tham khảo

WikiPedia: C_(ngôn_ngữ_lập_trình) http://www.csse.monash.edu.au/~damian/papers/HTML/... http://www.research.att.com/~bs/bs_faq.html#really... http://www.research.att.com/~bs/sibling_rivalry.pd... http://cm.bell-labs.com/cm/cs/who/dmr/chist.html http://cm.bell-labs.com/cm/cs/who/dmr/spacetravel.... http://www-106.ibm.com/developerworks/linux/librar... http://homepage.ntlworld.com/dmjones/cbook1_0a.pdf http://david.tribble.com/text/cdiffs.htm http://www.library.cornell.edu/nr/bookcpdf/c1-2.pd... http://catalogue.bnf.fr/ark:/12148/cb119665180